package com.wx.gof.pattern.creational.prototype;

import java.util.Date;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型，
 * 然后用复制这个原型对象的办法创建出更多同类型的对象
 * 描述:
 * 不需要知道任何创建的细节，不调用构造函数，使用克隆方法创建出对象
 * 适应场景:
 * 1.类初始化消耗较多资源
 * 2.new产生一个对象需要非常繁琐的过程
 * 3.构造函数比较复杂
 * 4.循环体中生产大量对象时
 * 优点:
 * 1.性能比new高,直接复制二进制流
 * 2.简化创建过程
 * 缺点:
 * 1.必须配备克隆方法clone
 * 2.深拷贝、浅拷贝运用得当
 * 理解:
 * 应用程序-原型设计模式(适合大批量循环内复杂对象的创建，原型设计模式是通过拷贝代替new，通过二进制流的形式复制，
 * 性能比直接new对象要快，拷贝分为浅拷贝与深拷贝)
 * @Date 2018-12-07-23:44
 */
public class Application {
    public static void main(String[] agrs) throws CloneNotSupportedException {
        /**
         * 浅拷贝-复制对象，对象里面如果有引用类型,复制出来对象的引用类型与原对象的引用类型是同一个
         */
        Pig pig = new Pig("小猪佩奇",18,new Date(0L));
        //复制对象
        Pig copyPig = (Pig)pig.clone();
        System.out.println(pig);
        System.out.println(copyPig);
        pig.getNow().setTime(666666L);
        System.out.println(pig);
        System.out.println(copyPig);

        /**
         * 深拷贝-复制对象，对象里面如果有引用类型,该引用类型也是一个全新类型
         */
        PigV2 pigV2 = new PigV2("小猪佩奇V2",18,new Date(0L));
        //复制对象
        PigV2 copyPigV2 = (PigV2)pigV2.clone();
        System.out.println(pigV2);
        System.out.println(copyPigV2);
        pigV2.getNow().setTime(666666L);
        System.out.println(pigV2);
        System.out.println(copyPigV2);

        //关于浅拷贝 深拷贝要合理使用，深拷贝主要是针对clone方法内部实现改造，具体怎么使用还是要看场景
    }
}
